Clase 5- Apoyo

Autor/a

MSc. José M. Avendaño

Fecha de publicación

23 de octubre de 2024

Este material fue compilado y adaptado por José M. Avendaño teniendo parcialmente códigos y conceptos desarrollados por Diego Kozlowski y Juan Barriola para un curso de R.

R base

Con R base nos referimos a los comandos básicos que vienen incorporados en el R, sin necesidad de cargar librerías.

Uso de la consola como una calculadora- operaciones aritméticas

  • En la consola podemos hacer calculos tal cual si estuviesemos usando una calculadora
5*3+6
[1] 21
5*(3+6)
[1] 45

tener presente el uso de los paréntesis y el orden en que serán ejecutadas las operaciones matemáticas

Definición de objetos

Los Objetos/Elementos constituyen la categoría esencial del R. De hecho, todo en R es un objeto, y se almacena con un nombre específico que no debe poseer espacios. Un número, un vector, una función, la progresión de letras del abecedario, una base de datos, un gráfico, constituyen para R objetos de distinto tipo. Los objetos que vamos creando a medida que trabajamos pueden visualizarse en el panel derecho superior de la pantalla (el Environment).

El operador <- (Alt + Guión) sirve para definir un objeto. A la izquierda del <- debe ubicarse el nombre que tomará el elemento a crear. Del lado derecho debe ir la definición del mismo.

A <- 1

Por ejemplo, podemos crear el elemento A, cuyo valor será 1. Para esto, debemos correr el código presionando Ctrl + Enter, con el cursor ubicado en cualquier parte de la línea. Al definir un elemento, el mismo queda guardado en el ambiente del programa, y podrá ser utilizado posteriormente para observar su contenido o para realizar una operación con el mismo.

A 
[1] 1
A+6
[1] 7

Al correr una linea con el nombre del objeto, la consola del programa nos muestra su contenido. Entre corchetes observamos el número de orden del elemento en cuestión. Si corremos una operación, la consola nos muestra el resultado de la misma.

El operador = es equivalente a <-, pero en la práctica no se utiliza para la definición de objetos.

B = 2
B
[1] 2

<- es un operador Unidireccional, es decir que:
A <- B implica que A va tomar como valor el contenido del objeto B, y no al revés.

A <- B
A      # Ahora A toma el valor de B, y B continúa conservando el mismo valor
[1] 2
B
[1] 2

Variables

Pueden contener cualquier estructura de datos como una matriz, un valor numérico, un texto, un vector y otras que se verán más adelante. Son creadas mediante el uso del operador de asignación.

Funciones Precargadas:

RBase cuenta con diversas funciones que ya vienen definidas con el lenguaje de programación. Muchas de ellas son comandos básicos para realizar rutinas de programación. Otro lote de funciones, distinto a otros lenguajes, son funciones para aplicar métodos inherentes a la estadística. Cuando se vea un texto en un script que está asociado a un verbo, o proceso, y posterior al nombre, viene acompañado de un signo de inicio de paréntesis y finaliza con otro signo de cierre de paréntesis, se está en presencia de una función. En algunos casos entre ambos signos de paréntesis aparecerá un texto que puede estar entre comillas, sin comillas y en otros casos varios textos separados por comas. Cuando se da este último caso se refiere a que la función necesita distintos argumentos para poder ejecutarse.

Ejemplos:

  1. Función sin argumento

    Sys.Date()
    [1] "2024-11-28"
  2. Función con un argumento

    head(mtcars)
                       mpg cyl disp  hp drat    wt  qsec vs am gear carb
    Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
    Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
    Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
    Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
  3. Función con múltiples argumentos

    # asignación variables
    velocidad <- cars$speed
    distancia <- cars$dist
    
    # crear un gráfico de tipo scatter plot (diagrama de dispersión )
    plot(velocidad, distancia)

Tipos de datos

Cuando queremos saber con cuál tipo de datos estamos trabajando necesitamos usar la función class().

Las funciones son series de procedimientos estandarizados, que toman como imput determinados argumentos a fijar por el usuario, y devuelven un resultado acorde a la aplicación de dichos procedimientos.

Su lógica de funcionamiento es:
funcion(argumento1 = arg1, argumento2 = arg2)

Otros ejemplos de funciones:

  • paste() : concatena una serie de caracteres, pudiendo indicarse cómo separar a cada uno de ellos

    paste('el valor de la variable A es:', A)
    [1] "el valor de la variable A es: 2"
    # se puede añadir el argumento "sep =" que será el que separará cada uno de los elementos que se están pegando en una sola string
    paste("Pega", "estas", 4, "palabras", sep = "_/")
    [1] "Pega_/estas_/4_/palabras"
    #Puedo concatenar caracteres almacenados en objetos
    var_nombre= 'nombre'
    var_apellido= 'apellido'
    var_ciudad= 'ciudad'
    paste(var_nombre, var_apellido, var_ciudad, sep = "**")
    [1] "nombre**apellido**ciudad"


  • paste0(): concatena una serie de caracteres sin separar con ningún espacio.

    paste0('el valor de la variable A es:',A)
    [1] "el valor de la variable A es:2"
    # Paste0 pega los caracteres sin separador
    paste(var_nombre, var_apellido, var_ciudad, sep = "**")
    [1] "nombre**apellido**ciudad"
  • sum(): suma de todos los elementos de un vector

    sum(A,B)
    [1] 4
    sum(1:5)
    [1] 15
  • mean() promedio aritmético de todos los elementos de un vector

    mean(A, B, 8)
    [1] 2
    mean(1:5)
    [1] 3

Vectores

Son colecciones de elementos que tienen que ser exclusivamente del mismo tipo, de la misma clase. Se usa la c () para declarar un vector. Los elementos que conforman el vector van separados por comas. Los vectores pueden, y es lo más común, les asignamos nombre como lo vimos con las variables. Incluso podemos tener vectores con una solo elemento (que de por si son las variables que ya estudiamos).

Tipos de vectores

vectores - numeric

Si queremos preguntar lo hacemos con la función is.numeric()

x=10
is.numeric(x)
[1] TRUE

En la lámina anterior vimos que el valor que retornó class(x) fue “numeric”.

  • Númericos: son aquellos que incluyen números enteros y decimales. En otros lenguajes se les conocen como números de tipo “float” y “double”.
x <- 2

class(x)
[1] "numeric"

vectores - integer

  • Enteros: hay casos en los que es necesario trabajar con números enteros sin que contenga ningún decimal. Estos números se declaran con el uso de una L posterior al número.
y <- 2L
y
[1] 2
class(y)
[1] "integer"

Ejemplo de una operación:

x <- 2.7
class(x)
[1] "numeric"
y <- 3L
class(y)
[1] "integer"

vectores - lógicos

  • Lógicos: Sirven para representar datos que solo pueden tener uno de estos dos valores

    • verdadero - TRUE
    • falso - FALSE

Operadores lógicos:

  • \(>\) (mayor a)
  • \(>=\) (mayor o igual a)
  • \(<\) (menor a)
  • \(<=\) (menor o igual a)
  • \(==\) (igual a)
  • \(!=\) (distinto a)
# Redefinimos los valores A y B
A <- 10
B <- 20

# Realizamos comparaciones lógicas
A >  B
[1] FALSE
A >= B
[1] FALSE
A <  B
[1] TRUE
A <= B
[1] TRUE
A == B
[1] FALSE
A != B
[1] TRUE
C <- A != B
C
[1] TRUE

Como muestra el último ejemplo, el resultado de una operación lógica puede almacenarse como el valor de un objeto.

x <- 2.7
y <-3L
z <- x==y
z
[1] FALSE
class(z)
[1] "logical"

acabamos de usar el operador ‘==’ que nos sirve para hacer una comparación de igualdad entre dos objetos. Lo que estamos es preguntando si son iguales el uno al otro y la respuesta que obtenemos es de tipo lógica booleana TRUE o FALSE

TRUE*4
[1] 4
FALSE*2
[1] 0

acabamos de ver coerción. Forzar a un cambio de un tipo de dato en otro tipo de dato. Los TRUE pueden ser interpretados mediante la coerción como 1 y los FALSE como 0

# dos es igual a 3?
2==3
[1] FALSE
# dos es distinto de tres? (tener presente que el ! 
# precediendo al igual quiere decir que es lo inverso 
# al igual, es decir, distinto)
2!=3
[1] TRUE
#dos es menor que tres?
2<3
[1] TRUE
#juan es igual a pedro? (hablamos del texto)
'juan'=='pedro'
[1] FALSE
# el texto jose es igual a jose?
'jose'=='jose'
[1] TRUE
#dos es igual a dos?
2==2
[1] TRUE
# a es menor que b?
'a'<'b'
[1] TRUE
# a es mayor que 8?
'a'>8
[1] TRUE
# a es igual a 1?
'a'==1
[1] FALSE

vectores - character

  • Datos de caracteres: se usan para almacenar cadenas de caracteres como por ejemplo un nombre, una oración, o cualquier valor que el computador no deba entender como un objeto lógico, número entero, númerico, matriz, etc. El valor debe estar declarado entre comillas simples ” o comilla sencilla ’. Prestar atención a no usar la tipo tilde ´ o cualquiera diferente a las mencionadas
nombre <- 'jose miguel'
no_es_numero <- '2'
no_es_numero
[1] "2"
class(no_es_numero)
[1] "character"
nchar(x)
[1] 3
nchar('hola')
[1] 4
nchar(5)
[1] 1
nchar(1532)
[1] 4

vectores - Date

  • Fechas El trabajo con las fechas puede llegar a ser un tanto complejo y será abordado de forma más intensiva adelante. Revisando algunas de las formas de trabajar con fechas tenemos el uso de las funciones Date y POSIXct
    • La función Date solo almacena la fecha calendario

    • La función POSIXct puede almacenar en conjunto hora y fecha

Las fechas se representan, en cualquiera de los casos como la cantidad de días (date) o segundos (POSIXct) que han transcurrido desde el 1 ero de enero de 1970.

fecha1 <- as.Date('2020-01-31')
fecha1
[1] "2020-01-31"
class(fecha1)
[1] "Date"
as.numeric(fecha1)
[1] 18292
fecha2 <- as.POSIXct('2020-01-31 11:15')
fecha2
[1] "2020-01-31 11:15:00 -04"
as.numeric(fecha2)
[1] 1580483700
class(fecha2)
[1] "POSIXct" "POSIXt" 

Vectores repaso:

numeros <- c(1,2,5,7)
numeros
[1] 1 2 5 7
class(numeros)
[1] "numeric"
textos <- c('juan','eliana','maria')
class(textos)
[1] "character"
textos
[1] "juan"   "eliana" "maria" 
logicos <- c(TRUE, FALSE, TRUE)
class(logicos)
[1] "logical"
is.numeric(numeros)
[1] TRUE
is.logical(textos)
[1] FALSE
is.character(textos)
[1] TRUE
unico <- c('aula')
unico
[1] "aula"
class(unico)
[1] "character"
errado <- c('texto', 1)
errado
[1] "texto" "1"    
class(errado)
[1] "character"
errado <- c('texto', 1)
errado
[1] "texto" "1"    
class(errado)
[1] "character"
#aplicó la coercion

Estructuras de Datos/ Objetos:

Todo lo que existe dentro de R es un objeto: funciones, vectores, etc. En R se puede trabajar con una gran cantidad de objetos distintos tanto en su tipo como tenerlos dentro de una sesión de trabajo.

Estas son algunos de los objetos que contienen datos con los cuales trabajaremos a lo largo del curso.

  • Valores
  • Vectores
  • Listas
  • Data Frames
  • Tibbles

No obstante, existen estructuras más complejas que no son de tipo tabular que no serán abordadas como la raster layers.

Caracteres especiales

  • R es sensible a mayúsculas y minúsculas, tanto para los nombres de las variables, como para las funciones y parámetros.

  • El numeral # se utiliza para hacer comentarios. Todo lo que se escribe después del # no es interpretado por R. Se debe utilizar un # por cada línea de código que se desea anular

  • Los corchetes [] se utilizan para acceder a un objeto:

    • en un vector[n° orden]
    • en una tabla[fila, columna]
    • en una lista[n° elemento]
  • el signo $ también es un método de acceso. Particularmente, en los dataframes, nos permitira acceder a una determinada columna de una tabla

  • Los paréntesis() se utilizan en las funciones para definir los parámetros.

  • Las comas , se utilizan para separar los parametros al interior de una función.

Nombres Variables

Ambientes de trabajo

Hay algunas cosas que tenemos que tener en cuenta respecto del orden del ambiente en el que trabajamos:

  • Working Directory: Es el directorio de trabajo. Pueden ver el suyo con getwd(), es hacia donde apunta el código, por ejemplo, si quieren leer un archivo, la ruta del archivo tiene que estar explicitada como el recorrido desde el Working Directory.
  • Environment: Esto engloba tanto la información que tenemos cargada en Data y Values, como las librerías que tenemos cargadas mientras trabajamos.

Es importante que mantengamos bien delimitadas estas cosas entre diferentes trabajos, sino:

  1. El directorio queda referido a un lugar específico en nuestra computadora.
  • Si se lo compartimos a otro se rompe
  • Si cambiamos de computadora se rompe
  • Si lo cambiamos de lugar se rompe
  • Si primero abrimos otro script se rompe
  1. Tenemos mezclados resultados de diferentes trabajos:
  • Nunca sabemos si esa variable/tabla/lista se creo en ese script y no otro
  • Perdemos espacio de la memoria
  • No estamos seguros de que el script cargue todas las librerías que necesita

Rstudio tiene una herramienta muy útil de trabajo que son los proyectos. Estos permiten mantener un ambiente de trabajo delimitado por cada uno de nuestros trabajos. Es decir:

  • El directorio de trabajo se refiere a donde esta ubicado el archivo .Rproj
  • El Environment es específico de nuestro proyecto.

Un proyecto no es un sólo script, sino toda una carpeta de trabajo.

Para crearlo, vamos al logo de nuevo projecto (Arriba a la derecha de la panatalla), y elegimos la carpeta de trabajo.

Tipos de archivos de R

  • Script: Es un archivo de texto plano, donde podemos poner el código que utilizamos para preservarlo
  • Rproject: Es un archivo que define la metadata del proyecto
  • RDS y Rdata: Dos formatos de archivos propios de R para guardar datos.
  • qmd: archivo de Quarto, el cual es un sistema de publicaciones (página web, blogs, que puede contener códigos y otros objetos resultados de una rutina de programación acompañados por texto legible.

Remover objetos del Global Environment

En caso de querer remover un objeto (todo lo que existe dentro del programa que estamos ejecutando) del “global environment” podemos usar la función rm() teniendo como argumento el nombre del objeto que queremos remover

rm("nombre")